package com.lecture.java8.multithreading;

/**
 * @author luyn
 * @version 1.0
 * @description 使用两个线程交替打印1-100
 *
 * 线程通信：wait()使得调用wait方法的线程进入阻塞状态，并且会释放当前线程的锁
 *         notify()唤醒另外一个被wait的线程，如果有多个wait的线程，就唤醒优先级高的线程
 *         notifyAll();唤醒另外所有的被wait的线程
 * 注意：这三个方法必须使用在同步代码块或同步方法中（synchronized中）。
 *
 * @date 2021/1/15 9:11
 */
public class CommunicationTest {

    public static void main(String[] args) {
        Number number = new Number();
        Thread t1 = new Thread(number);
        Thread t2 = new Thread(number);
        t1.setName("线程1");
        t2.setName("线程2");
        t1.start();
        t2.start();


    }
}

class Number implements Runnable{

    private int num = 1;

    @Override
    public void run() {
        while (true) {
           synchronized (this) {
               notify();
               if (num <= 100) {
                   try {
                       Thread.sleep(100);
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
                   System.out.println(Thread.currentThread().getName() + "：" + num);
                   num ++;
                   try {
                       wait();
                       System.out.println(Thread.currentThread().getName() + "：执行了wait方法");
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
               } else {
                   break;
               }
           }
        }
    }
}